<?php

//生成随机验证码
/**
*	@功能:   		 生成随机验证码
*	@param1 $num: 	 生成的验证码的个数  
*	@param2 $type: 	 生成的验证码的类型 (0: 纯数字; 1: 纯字母; 2:数字字母混合)
*	@param3 $width:  验证码画布的宽度
*	@param4 $height: 验证码画布的高度
*	@返回值: 		 指定位数的验证码
*
*/

//code();
function  code($num = 4, $type = 1 , $width = 100 , $height = 40) {
	
	//创建画布
	$image = imagecreatetruecolor($width , $height);
	
	//给画布填充颜色
	imagefill($image, 0 , 0 ,lightColor($image));
	
	//选择验证码类型
	switch ($type) {
		
		case 1:		//纯数字
			$code = randNum($num);
			break;
		
		case 2:		//纯小写字母
			$code = randMinChar($num);
			break;
		
		case 3:		//纯大写字母
			$code = randMaxChar($num);
			break;
		
		case 4:		//大小写混合字母
			$code = randMixChar($num);
			break;
			
		case 5:		//数字字母混合
			$code = randNumChar($num);
			break;
	
		default:
			$code = randNum($num);
			break;
	}
	
	
	//写上字符 (验证码)
	
	//划分字符分布区域
	
	for ($i = 0 ; $i < $num ; $i++) {
		
		$cellWidth = $width / $num;
		$x = mt_rand($i * $cellWidth , ($i + 1) * $cellWidth - 15);
		$y = mt_rand(0, $height - 15);
		//imagestring($image, 6 , $x , $y , $code[$i] , darkColor($image));
		imagechar($image, 6 , $x , $y , $code[$i] , darkColor($image));
	
	}
	
	//画干扰点(若干)
	for ($i = 0 ; $i < $width / $num * 2; $i++) {
		imagesetpixel($image , mt_rand(0 , $width) , mt_rand(0 , $height), lightColor($image));
	}

	//画椭圆弧 (若干)
	for ($i = 0 ; $i < $width / ($num * 4) ; $i++) {
		imagearc($image , mt_rand(0 , $width) , mt_rand(0 , $height),20,5,mt_rand(0,210),mt_rand(90,270), lightColor($image));
	}
	//告知浏览器输出类型
	header('content-type:image/png');
	
	//输出到浏览器
	imagepng($image);
	
	//销毁资源
	imagedestroy($image);
	
	//返回验证码
	return $code;
}






//定义深颜色的函数
/**
*	@功能:	 生成随机深颜色的函数
*	@param1: 图片资源
*	@返回值: 随机深颜色
*/

function darkColor($image) {
	
	return imagecolorallocate($image , mt_rand(0 , 120), mt_rand(0,120), mt_rand(0,120));
}

//定义浅颜色的函数
/**
*	@功能:	 生成随机浅颜色的函数
*	@param1: 图片资源
*	@返回值: 随机浅颜色
*/
function lightColor($image) {
	
	return imagecolorallocate($image , mt_rand(130 , 255) , mt_rand(130, 255) , mt_rand(130, 255));
}

//定义生成纯数字的函数
/**
*	@功能:	 生成纯数字的函数
*	@param1: 随机数字个数
*	@返回值: 指定个数的纯数字字符串
*/

function randNum($num = 4) {
	
	$str = '0123456789';
	$str2 = str_shuffle($str);
	//var_dump($str2);
	return substr($str2 , 0 , $num);
	
}

//定义生成纯大写字母的函数
/**
*	@功能:	 生成纯大写字母的函数
*	@param1: 随机大写字母个数
*	@返回值: 指定个数的大写字母字符串
*/

function randMaxChar($num = 4) {
	
	$arr = range('A','Z');
	shuffle($arr);
	$str = join('', $arr);
	return substr($str, 0 , $num);
}

//定义生成纯小写字母的函数
/**
*	@功能:	 生成纯小写字母的函数
*	@param1: 随机小写字母个数
*	@返回值: 指定个数的小写字母字符串
*/


function randMinChar($num = 4) {
	
	$arr = range('a','z');
	shuffle($arr);
	$str = join('', $arr);
	return substr($str, 0 , $num);
}
//定义生成大小写字母混合的函数
/**
*	@功能:	 生成大小写混合字母的函数
*	@param1: 随机混合字母个数
*	@返回值: 指定个数的混合字母字符串
*/

function randMixChar($num = 4) {
	
	$arr = range('a','z');
	$arr2 = range('A','Z');
	$arr3 = array_merge($arr, $arr2);
	shuffle($arr3);
	$str = join('', $arr3);
	return substr($str, 0 , $num);
}

//定义生成数字字母混合的函数
/**
*	@功能:	 生成数字字母混合的函数
*	@param1: 随机混合字符个数
*	@返回值: 指定个数的混合字符串
*/

function randNumChar($num = 4) {

	$arr = range('a','z');
	$arr2 = range('A','Z');
	$arr3 = range(0,9);
	$arr4 = array_merge($arr, $arr2, $arr3);
	shuffle($arr4);
	$str = join('', $arr4);
	return substr($str, 0 , $num);
}


//随机字符函数测试
//var_dump(randNum(4));		//纯数字
//var_dump(randMaxChar(4));	//纯小写
//var_dump(randMinChar(4));	//纯大写
//var_dump(randMixChar(4));	//大小写混合
//var_dump(randNumChar(4));	//数字字母混合